<?php
/**
 * 選手情報データ制御
 *
 * @author admin
 *
 */
class Models_Players_Controller
{
	/** 学校種別：小学校 */
	const JUNIOR_SCHOOL = 'junior_school';
	/** 学校種別：中学校 */
	const MIDDLE_SCHOOL = 'middle_school';
	/** 学校種別 ：高校*/
	const HIGH_SCHOOL = 'high_school';

	/** パース配列リスト開始キー */
	const KEY_LIST      = 'LIST';
	/** 年齢 */
	const KEY_AGE       = 'AGE';
	/** 選手パース開始キー */
	const KEY_PLAYER    = 'PLAYER';
	/** 選手名 */
	const KEY_NAME      = 'NAME';
	/** 選手ＩＤ */
	const KEY_ID        = 'ID';
	/** ニックネーム */
	const KEY_NICNAME="NICNAME";

	/**  選手データセット */
	protected $_aryDataList;

	/** 暗号初期化キー */
	protected $_iv;

	/**
	 * 選手リスト配列を取得する
	 * ：選手ＩＤの不整合データは削除される
	 * @param array $arySelectAgeList （省略可）
	 */
	public function getPlayerList( $arySelectAgeList='' )
	{
		if ( ( $arySelectAgeList == '') || ( !is_array($arySelectAgeList) || count( $arySelectAgeList ) == 0 ) ) {
			return $this->_aryDataList;
		}

		$iDataListCount = count($this->_aryDataList);
		$aryResult = array();
		foreach ($arySelectAgeList as $strSelectAge) {
			$i = 0;
			while ( $i < $iDataListCount ) {
				if ( $this->_aryDataList[$i][self::KEY_AGE] == $strSelectAge ) {
					$aryResult[] = $this->_aryDataList[$i];
				}
				$i ++;
			}
		}

		return $aryResult;
	}

	/**
	 * 指定年齢が一人でも存在すればTRUEを返す
	 *
	 * @param string $sAge 指定年齢
	 */
	public function isAgeExists( $sAge )
	{
		$aryPlayerList = $this->getPlayerList( array($sAge) );
		if ( count ( $aryPlayerList ) > 0 ) {
			return TRUE;
		}
		return FALSE;
	}

	/**
	 * IDに該当する選手の名前を返す
	 * Enter description here ...
	 * @param string $strId		ID
	 */
	public function getName( $strId )
	{
		if ( $this->_aryDataList === FALSE ) {
			return '';
		}
		foreach ( $this->_aryDataList as $aryData ) {
			if ( $aryData[self::KEY_ID] == $strId ) {
				return $aryData[self::KEY_NAME];
			}
		}
		return '';
	}

	/**
	 * IDに該当する選手のニックネームを返す
	 * Enter description here ...
	 * @param unknown_type $strId ＩＤ
	 * @return String
	 */
	public function getNicName( $strId )
	{
		if ( $this->_aryDataList === FALSE ) {
			return '';
		}
		foreach ( $this->_aryDataList as $aryData ) {
			if ( $aryData[self::KEY_ID] == $strId ) {
				if ( isset( $aryData[self::KEY_NICNAME]) ) {
					return $aryData[self::KEY_NICNAME];
				} else {
					return $aryData[self::KEY_NAME];
				}
			}
		}
		return '';
	}

	/**
	 * 選手データセットから指定キーについて値が一致するエントリを返す
	 * Enter description here ...
	 * @param string $strKey 指定キー
	 * @param string $strValue 値
	 */
	public function &search( $strKey, $strValue )
	{
		$iDataListCount = count($this->_aryDataList);
		$i = 0;
		while ( $i < $iDataListCount ) {
			if ( $this->_aryDataList[$i][$strKey] == $strValue ) {
				return $this->_aryDataList[$i];
			}
			$i ++;
		}
		$bResult = FALSE;
		return $bResult;
	}

	/**
	 * 指定IDに該当する選手を削除する
	 * Enter description here ...
	 * @param string $strId
	 */
	public function delete( $strId )
	{
		$iDeleteCount = 0;
		$iDataListCount = count($this->_aryDataList);
		$i = 0;
		while ( $i < $iDataListCount ) {
			if ( $this->_aryDataList[$i][self::KEY_ID] == $strId ) {
				unset( $this->_aryDataList[$i] );
				$iDeleteCount ++;
			}
			$i ++;
		}
		$this->_aryDataList = array_merge($this->_aryDataList);
		return $iDeleteCount;
	}

	/**
	 * 指定氏名の指定年齢に選手を追加する
	 * Enter description here ...
	 * @param string $strAge 年齢
	 * @param string $strName 氏名
	 */
	public function add( $strAge, $strName )
	{
		$strId = self::createId();
		$aryDataset = array(
				self::KEY_ID    => $strId,
				self::KEY_AGE   => $strAge,
				self::KEY_NAME  => $strName
		);

		$this->_aryDataList[] = $aryDataset;
	}

	/**
	 * 指定IDのエントリを更新する
	 *
	 * @param $strId ID
	 * @param $strAge 年齢
	 * @param $strName 選手氏名
	 */
	public function update($strId, $strAge, $strName )
	{
		$aryData = &$this->search(self::KEY_ID, $strId);
		if ( $aryData === FALSE ) {
			$this->add($strAge, $strName);
		} else {
			$aryData[self::KEY_AGE] = $strAge;
			$aryData[self::KEY_NAME] = $strName;
		}
	}

	/**
	 * ID生成
	 * Enter description here ...
	 */
	public static function createId()
	{
		$aryDivide = explode( ' ', microtime() );
		$iResult = $aryDivide[0] + $aryDivide[1];
		return $iResult;
	}

	/**
	 * 暗号化
	 *
	 * @param string $sSrc データ
	 * @param string $sKey 暗号化キー
	 */
	public function encode($text, $key)
	{
		srand();
		$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
		$this->_iv = '1234567890123456';
		$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_ECB, $this->_iv);
		$hex = bin2hex($encrypted);
		return $hex;
	}

	/**
	 * 複合化
	 * @param unknown_type $sSrc
	 * @param unknown_type $key
	 */
	public function decode($hex, $key)
	{
		$bin = pack('H*', $hex);
		$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $bin, MCRYPT_MODE_ECB, $this->_iv);
		$decrypted = trim($decrypted);
		return $decrypted;
	}

	/**
	 * 学年選択オプション設定
	 * Enter description here ...
	 * @param unknown_type $Kind
	 */
	public static function getAgeOptions($SchoolKind)
	{
		$aryAgeOptions = array();
		switch	($SchoolKind) {
			case self::JUNIOR_SCHOOL:
				$aryAgeOptions
				= array(
				'U7'=>'１年生',
				'U8'=>'２年生',
				'U9'=>'３年生',
				'U10'=>'４年生',
				'U11'=>'５年生',
				'U12'=>'６年生',
				);
				break;
			case self::MIDDLE_SCHOOL:
				$aryAgeOptions
				= array(
				'U13'=>'１年生',
				'U14'=>'２年生',
				'U15'=>'３年生',
				);
				break;
			case self::HIGH_SCHOOL:
				$aryAgeOptions
				= array(
				'U16'=>'１年生',
				'U17'=>'２年生',
				'U18'=>'３年生',
				);
				break;
		}
		return $aryAgeOptions;
	}

	/**
	 * 学校種別に従った初学年年齢を返す
	 * @return integer 初学年年齢
	 */
	public static function getStartAge($SchoolType)
	{
		$iStartAge = 7;
		switch($SchoolType) {
			case self::JUNIOR_SCHOOL:
				$iStartAge = 7;
				break;
			case self::MIDDLE_SCHOOL:
				$iStartAge = 13;
				break;
			case self::HIGH_SCHOOL:
				$iStartAge = 16;
				break;
		}
		return $iStartAge;
	}

	/**
	 * 卒業学年を返す
	 * @param unknown_type $SchoolType
	 * @return number 卒業学年
	 */
	public static function getSotugyoGakunen($SchoolType)
	{
		$iSotugyoGakunen = 6;
		switch($SchoolType) {
			case self::JUNIOR_SCHOOL:
				$iSotugyoGakunen = 6;
				break;
			case self::MIDDLE_SCHOOL:
				$iSotugyoGakunen = 3;
				break;
			case self::HIGH_SCHOOL:
				$iSotugyoGakunen = 3;
				break;
		}
		return $iSotugyoGakunen;
	}

	/**
	 * 指定年齢から学年を返す
	 * @param unknown_type $iAge
	 */
	public static function _getGakunenFromAge($iAge)
	{
		$iResult = '1';
		switch ( $iAge ) {
			case 7:
				$iResult=	1;
				break;
			case 8:
				$iResult=	2;
				break;
			case 9:
				$iResult=	3;
				break;
			case 10:
				$iResult=	4;
				break;
			case 11:
				$iResult=	5;
				break;
			case 12:
				$iResult=	6;
				break;
			case 13:
				$iResult=	1;
				break;
			case 14:
				$iResult=	2;
				break;
			case 15:
				$iResult=	3;
				break;
			case 16:
				$iResult=	1;
				break;
			case 17:
				$iResult=	2;
				break;
			case 18:
				$iResult=	3;
				break;
		}
		return $iResult;
	}
}